/*
* Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.wso2.carbon.device.mgt.iot.services;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.log4j.Logger;
import org.wso2.carbon.device.mgt.iot.config.DeviceConfigurationManager;
import org.wso2.carbon.device.mgt.iot.config.DeviceManagementConfig;
import org.wso2.carbon.device.mgt.iot.config.DeviceManagementControllerConfig;
import org.wso2.carbon.device.mgt.iot.config.DeviceManagementSecurityConfig;
import org.wso2.carbon.device.mgt.iot.config.controlqueue.DeviceControlQueueConfig;
import org.wso2.carbon.device.mgt.iot.config.datastore.DeviceDataStoreConfig;
import org.wso2.carbon.device.mgt.iot.devicecontroller.ControlQueueConnector;
import org.wso2.carbon.device.mgt.iot.devicecontroller.DataStoreConnector;
import org.wso2.carbon.device.mgt.iot.exception.DeviceControllerServiceException;
import org.wso2.carbon.device.mgt.iot.utils.ResourceFileLoader;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Context;
import java.io.File;
import java.util.HashMap;
//@Path(value = "/DeviceController")
public class DeviceControllerService {
private static Logger log = Logger.getLogger(DeviceControllerService.class);
private static DataStoreConnector iotDataStore = null;
private static ControlQueueConnector iotControlQueue = null;
private static DeviceDataStoreConfig dataStoreConfig = null;
private static DeviceControlQueueConfig controlQueueConfig = null;
static {
String trustStoreFile = null;
String trustStorePassword = null;
File certificateFile = null;
DeviceManagementConfig config = null;
try {
config = DeviceConfigurationManager.getInstance().getFireAlarmMgtConfig();
} catch (DeviceControllerServiceException ex) {
log.error(ex.getMessage(), ex);
}
if (config != null) {
/* reading security configurations */
DeviceManagementSecurityConfig securityConfig = config.getDeviceManagementSecurityConfig();
trustStoreFile = securityConfig.getClient();
trustStorePassword = securityConfig.getTrustStorePassword();
certificateFile = new ResourceFileLoader("/resources/security/" + trustStoreFile).getFile();
if (certificateFile.exists()) {
trustStoreFile = certificateFile.getAbsolutePath();
log.info("Trust Store Path : " + trustStoreFile);
System.setProperty("javax.net.ssl.trustStore", trustStoreFile);
System.setProperty("javax.net.ssl.trustStorePassword", trustStorePassword);
} else {
log.error("Trust Store not found in path : " + trustStoreFile);
}
// controller configurations
DeviceManagementControllerConfig controllerConfig = config.getFireAlarmManagementControllerConfig();
// reading data store configurations
String deviceDataStoreKey = controllerConfig.getDeviceDataStore();
log.info("Active Data-Store: " + deviceDataStoreKey);
dataStoreConfig = (DeviceDataStoreConfig) config.getDataStoresMap().get(deviceDataStoreKey);
if (dataStoreConfig == null) {
log.error("Error occurred when trying to read data stores configurations");
}
//initialization data store
try {
String handlerClass = dataStoreConfig.getHandlerClass().trim();
Class<?> dataStore = DeviceControllerService.class.forName(handlerClass);
if (DataStoreConnector.class.isAssignableFrom(dataStore)) {
iotDataStore = (DataStoreConnector) dataStore.newInstance();
iotDataStore.initDataStore();
}
} catch (ClassNotFoundException | IllegalAccessException | InstantiationException ex) {
log.error("Error occurred when trying to initiate data store", ex);
} catch (DeviceControllerServiceException ex) {
log.error(ex.getMessage(), ex);
}
// reading control queue configurations
String controlQueueKey = controllerConfig.getDeviceControlQueue();
controlQueueConfig = (DeviceControlQueueConfig) config.getControlQueuesMap().get(controlQueueKey);
if (controlQueueConfig == null) {
log.error("Error occurred when trying to read control queue configurations");
}
//initialization control queue
try {
String handlerClass = controlQueueConfig.getHandlerClass().trim();
Class<?> controlQueue = DeviceControllerService.class.forName(handlerClass);
if (ControlQueueConnector.class.isAssignableFrom(controlQueue)) {
iotControlQueue = (ControlQueueConnector) controlQueue.newInstance();
iotControlQueue.initControlQueue();
}
} catch (ClassNotFoundException | IllegalAccessException | InstantiationException ex) {
log.error("Error occurred when trying to initiate control queue", ex);
} catch (DeviceControllerServiceException ex) {
log.error(ex.getMessage(), ex);
}
}
}
@Path("/pushdata/{owner}/{type}/{id}/{time}/{key}/{value}") @POST
// @Produces("application/xml")
public static String pushData(@PathParam("owner") String owner, @PathParam("type") String deviceType,
@PathParam("id") String deviceId, @PathParam("time") Long time, @PathParam("key") String key,
@PathParam("value") String value, @HeaderParam("description") String description,
@Context HttpServletResponse response) {
HashMap<String, String> deviceDataMap = new HashMap<String, String>();
deviceDataMap.put("owner", owner);
deviceDataMap.put("deviceType", deviceType);
deviceDataMap.put("deviceId", deviceId);
deviceDataMap.put("time", "" + time);
deviceDataMap.put("key", key);
deviceDataMap.put("value", value);
deviceDataMap.put("description", description);
//DeviceValidator deviceChecker = new DeviceValidator();
//DeviceIdentifier dId = new DeviceIdentifier();
//dId.setId(deviceId);
//dId.setType(deviceType);
// try {
// boolean exists = deviceChecker.isExist(owner, dId);
String result = null;
// if (exists) {
try {
iotDataStore.publishIoTData(deviceDataMap);
response.setStatus(HttpStatus.SC_ACCEPTED);
result = "Data Published Succesfully...";
} catch (DeviceControllerServiceException e) {
response.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR);
result = "Failed to push " + description + " data to dataStore at " + dataStoreConfig.getEndPoint() + ":"
+ dataStoreConfig.getPort();
}
//
// }
//
return result;
//
// } catch (InstantiationException e) {
// response.setStatus(500);
// return null;
// } catch (IllegalAccessException e) {
// response.setStatus(500);
// return null;
// } catch (ConfigurationException e) {
// response.setStatus(500);
// return null;
// } catch (DeviceCloudException e) {
// response.setStatus(500);
// return null;
// }
}
@Path("/setcontrol/{owner}/{type}/{id}/{key}/{value}") @POST public static String setControl(
@PathParam("owner") String owner, @PathParam("type") String deviceType, @PathParam("id") String deviceId,
@PathParam("key") String key, @PathParam("value") String value, @Context HttpServletResponse response) {
HashMap<String, String> deviceControlsMap = new HashMap<String, String>();
deviceControlsMap.put("owner", owner);
deviceControlsMap.put("deviceType", deviceType);
deviceControlsMap.put("deviceId", deviceId);
deviceControlsMap.put("key", key);
deviceControlsMap.put("value", value);
String result = null;
try {
iotControlQueue.enqueueControls(deviceControlsMap);
response.setStatus(HttpStatus.SC_ACCEPTED);
result = "Controls added to queue succesfully..";
} catch (DeviceControllerServiceException e) {
response.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR);
result = "Failed to enqueue data to queue at " + controlQueueConfig.getEndPoint() + ":" + controlQueueConfig
.getPort();
}
return result;
}
// public static void main(String[] args) {
//
// DeviceController myController = new DeviceController();
// String pushOut =
// myController.pushData("10.100.7.38", "Arduino", "Shabirmean", "123456",
// Long.parseLong("234890"), "Sensor", "23", "Testing");
//
// String setOut = myController.setControl("Shabirmean", "Arduino",
// "123456", "13", "HIGH");
//
// System.out.println("---------------------------------------");
// System.out.println("PUSH : " + pushOut);
// System.out.println("---------------------------------------");
// System.out.println("SET : " + setOut);
// }
}